using System;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.UI.Security.Services;
using System.Collections.Generic;
using Sinacor.Infra.Common;
using Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.ManutencaoOrdens.Negocio;
using Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio;

namespace Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Translator.DataContractToModel
{
    /// <summary>
    /// Traduz um contrato de dados em um modelo
    /// </summary>
    public class Negocio
    {
		public Negocio(){}

		/// <summary>
        /// ToBolsa
		/// </summary>
		/// <param name="from"></param>
		/// <returns></returns>
		public Model.Bolsa ToBolsa(Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.BolsaResponse from)
        {
            Model.Bolsa retorno = new Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Bolsa();

            if (from == null)
                return null;

            retorno.Codigo = from.Codigo;
            retorno.Descricao = from.Descricao;            

            return retorno;
		}

		/// <summary>
        /// ToBolsa - LIST
		/// </summary>
		/// <param name="from"></param>
		/// <returns></returns>
        public ModelCollection<Model.Bolsa> ToBolsa(List<Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.BolsaResponse> from)
        {
            ModelCollection<Model.Bolsa> lista = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Bolsa>();
            Model.Bolsa item = null;

            if (from == null)
                return null;

            foreach (Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.BolsaResponse inLista in from)
            {
                item = this.ToBolsa(inLista);
                lista.Add(item);
            }

            return lista;
		}

        /// <summary>
        /// Metodo ToNegocio - List
        /// </summary>
        /// <param name="from"></param>
        /// <returns></returns>
        public ModelCollection<Model.Negocio> ToNegocio(List<Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.ManutencaoOrdens.Negocio.NegocioResponse> from)
        {
            ModelCollection<Model.Negocio> lista = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Negocio>();
           
            if (from == null)
                return null;

            foreach (Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.ManutencaoOrdens.Negocio.NegocioResponse item in from)
            {
                lista.Add(this.ToNegocio(item));
            }

            return lista;
        }

        /// <summary>
        /// Metodo ToNegocio
        /// </summary>
        /// <param name="from"></param>
        /// <returns></returns>
        public Model.Negocio ToNegocio(Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.ManutencaoOrdens.Negocio.NegocioResponse from)
        {

            Model.Negocio response = new Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Negocio();

            if (from == null)
                return null;

                response.Bolsa = from.Bolsa;
                response.Codigo = from.Codigo;
                response.ContraParte = from.ContraParte;
                response.DataPregao = from.DataPregao;
                response.Digito = from.Digito;
                response.Liquidacao = from.Liquidacao;

                switch (from.Mercado)
                {
                    case Communication.Bovespa.ManutencaoOrdens.Negocio.TipoMercado.Vista:
                        response.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.Vista;
                        break;
                    case Communication.Bovespa.ManutencaoOrdens.Negocio.TipoMercado.OpcaoCompra:
                        response.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.OpcaoCompra;
                        break;
                    case Communication.Bovespa.ManutencaoOrdens.Negocio.TipoMercado.OpcaoVenda:
                        response.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.OpcaoVenda;
                        break;
                    case Communication.Bovespa.ManutencaoOrdens.Negocio.TipoMercado.ExercicioOpcaoCompra:
                        response.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.ExercicioOpcaoCompra;
                        break;
                    case Communication.Bovespa.ManutencaoOrdens.Negocio.TipoMercado.ExercicioOpcaoVenda:
                        response.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.ExercicioOpcaoVenda;
                        break;
                    case Communication.Bovespa.ManutencaoOrdens.Negocio.TipoMercado.Fracionario:
                        response.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.Fracionario;
                        break;
                    case Communication.Bovespa.ManutencaoOrdens.Negocio.TipoMercado.Estruturado:
                        response.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.Estruturado;
                        break;
                    case Communication.Bovespa.ManutencaoOrdens.Negocio.TipoMercado.Leilao:
                        response.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.Leilao;
                        break;
                    case Communication.Bovespa.ManutencaoOrdens.Negocio.TipoMercado.Termo:
                        response.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.Termo;
                        break;
                    case Communication.Bovespa.ManutencaoOrdens.Negocio.TipoMercado.LeilaoNaoCotados:
                        response.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.LeilaoNaoCotados;
                        break;
                    case Communication.Bovespa.ManutencaoOrdens.Negocio.TipoMercado.Futuro:
                        response.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.Futuro;
                        break;
                    case Communication.Bovespa.ManutencaoOrdens.Negocio.TipoMercado.VencimentoFuturo:
                        response.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.VencimentoFuturo;
                        break;
                    case Communication.Bovespa.ManutencaoOrdens.Negocio.TipoMercado.BOX:
                        response.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.BOX;
                        break;
                    case Communication.Bovespa.ManutencaoOrdens.Negocio.TipoMercado.CotasETF:
                        response.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.CotasETF;
                        break;
                    case Communication.Bovespa.ManutencaoOrdens.Negocio.TipoMercado.IntegralizacaoResgateCotas:
                        response.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.IntegralizacaoResgateCotas;
                        break;
                }

                switch (from.NaturezaOperacao)
                {
                    case Communication.Bovespa.ManutencaoOrdens.Negocio.NaturezaOperacao.Compra:
                        response.NaturezaOperacao = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.NaturezaOperacao.Compra;
                        break;
                    case Communication.Bovespa.ManutencaoOrdens.Negocio.NaturezaOperacao.Venda:
                        response.NaturezaOperacao = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.NaturezaOperacao.Venda;
                        break;
                    case Communication.Bovespa.ManutencaoOrdens.Negocio.NaturezaOperacao.CompraVenda:
                        response.NaturezaOperacao = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.NaturezaOperacao.CompraVenda;
                        break;
                }

                response.Numero = from.Numero;
                response.Operador = from.Operador;
                if (from.Ordem != null)
                {
                    response.Ordem = new Sinacor.UI.Bovespa.ManutencaoOrdens.Model.ChaveOrdem()
                    {
                        DataOrdem = from.Ordem.DataOrdem,
                        NumeroOrdem = from.Ordem.NumeroOrdem,
                        NumeroOrdemSubSequencia = from.Ordem.NumeroOrdemSubSequencia
                    };
                }
                
                response.Quantidade = from.Quantidade;
                response.QuantidadeCasada = from.QuantidadeCasada;
                response.Saldo = from.Saldo;
                response.Valor = from.Valor;  

            return response;
        }

        /// <summary>
        /// ToNegocio
        /// </summary>
        /// <param name="from"></param>
        /// <returns></returns>
        public Model.Negocio ToNegocio(Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.NegocioResponse from)
        {
            if (from == null) return null;

            Model.Negocio to = new Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Negocio();

            to.Bolsa = from.Bolsa;            
            to.Numero = from.NumeroNegocio.Value;
            to.Codigo = from.Titulo.Codigo;    
            to.CodigoCliente = from.Cliente;
            to.ContraParte = from.ContraParte;
            to.DataNegocio = from.DataNegocio;
            to.DataPregao = from.DataPregao.Value;
            to.DiasLiquidacao = from.DiasLiquidacao;
            to.Digito = from.DigitoNegocio;
            to.Especificacao = from.Titulo.Especificacao;
            to.HoraNegocio = from.HoraNegocio;
            to.FatorValorizacao = from.FatorValorizacao;

            if(from.TituloObjeto != null)
                to.TituloObjeto = from.TituloObjeto;
            

            switch (from.TipoMercado.Value)
            {
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.TipoMercado.BOX:
                    to.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.BOX;
                    break;
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.TipoMercado.CotasETF:
                    to.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.CotasETF;
                    break;
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.TipoMercado.Estruturado:
                    to.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.Estruturado;
                    break;
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.TipoMercado.ExercicioOpcaoCompra:
                    to.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.ExercicioOpcaoCompra;
                    break;
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.TipoMercado.ExercicioOpcaoVenda:
                    to.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.ExercicioOpcaoVenda;
                    break;
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.TipoMercado.Fracionario:
                    to.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.Fracionario;
                    break;
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.TipoMercado.Futuro:
                    to.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.Futuro;
                    break;
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.TipoMercado.IntegralizacaoResgateCotas:
                    to.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.IntegralizacaoResgateCotas;
                    break;
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.TipoMercado.Leilao:
                    to.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.Leilao;
                    break;
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.TipoMercado.LeilaoNaoCotados:
                    to.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.LeilaoNaoCotados;
                    break;
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.TipoMercado.OpcaoCompra:
                    to.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.OpcaoCompra;
                    break;
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.TipoMercado.OpcaoVenda:
                    to.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.OpcaoVenda;
                    break;
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.TipoMercado.OpcaoVendaCompra:
                    to.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.OpcaoVendaCompra;
                    break;
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.TipoMercado.Termo:
                    to.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.Termo;
                    break;
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.TipoMercado.VencimentoFuturo:
                    to.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.VencimentoFuturo;
                    break;
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.TipoMercado.Vista:
                    to.Mercado = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.Vista;
                    break;

                default:
                    break;
            } 
            
            to.NaoLiquidaNota = from.NaoLiquidaNota.Value;

            switch (from.TipoNaturezaOperacao)
            {
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.TipoNaturezaOperacao.Compra:
                    to.NaturezaOperacao = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.NaturezaOperacao.Compra;
                    break;
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.TipoNaturezaOperacao.Venda:
                    to.NaturezaOperacao = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.NaturezaOperacao.Venda;
                    break;

                default:
                    break;
            }

            to.Numero = from.NumeroNegocio.Value;
            to.Operador = from.Operador;            
            to.Preco = from.Preco;
            to.Quantidade = from.Quantidade;
            to.QuantidadeCasada = from.QuantidadeCasada;
            to.Saldo = from.Saldo;

            switch (from.TipoSituacao.Value)
            {
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.TipoSituacaoCasamento.Casadas:
                    to.SituacaoCasamento = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.SituacaoCasamento.Casada;
                    break;
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.TipoSituacaoCasamento.CasadasParte:
                    to.SituacaoCasamento = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.SituacaoCasamento.ParcialmenteCasada;
                    break;
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.TipoSituacaoCasamento.NaoCasadas:
                    to.SituacaoCasamento = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.SituacaoCasamento.NaoCasada;
                    break;               

                default:
                    break;
            }


            switch (from.TipoLiquidacao.Value)
            {
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.TipoLiquidacaoNegocio.LiquidacaoPeloBruto:
                    to.TipoLiquidacao = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoLiquidacaoNegocio.LiquidacaoPeloBruto;
                    break;
               case Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.TipoLiquidacaoNegocio.LiquidacaoPeloLiquido:
                    to.TipoLiquidacao = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoLiquidacaoNegocio.LiquidacaoPeloLiquido;
                    break;

                default:
                    break;
            }


            switch (from.TipoTermo)
            {
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.TipoTermo.AcordoMutuo:
                    to.TipoTermo = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoTermo.AcordoMutuo;
                    break;
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.TipoTermo.Nenhum:
                    to.TipoTermo = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoTermo.Nenhum;
                    break;
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.TipoTermo.VontadeComprador:
                    to.TipoTermo = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoTermo.VontadeComprador;
                    break;
                case Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.TipoTermo.VontadeVendedor:
                    to.TipoTermo = Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoTermo.VontadeVendedor;
                    break;
                default:
                    break;
            }
                       
            to.VencimentoTermo = from.VencimentoOpcoesTermo;

            return to;

        }

        /// <summary>
        /// ToNegocio
        /// </summary>
        /// <param name="from"></param>
        /// <returns></returns>
        public ModelCollection<Model.Negocio> ToNegocio(List<Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.NegocioResponse> from)
        {
            ModelCollection<Model.Negocio> lista = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Negocio>();

            if (from == null)
                return null;

            foreach (Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.Ordens.Negocio.NegocioResponse item in from)
            {
                lista.Add(this.ToNegocio(item));
            }

            return lista;
        }

	}
}